﻿using System.Collections.Generic;
using StockholmsStad.Web.UI.Class.Interfaces;
using StockholmsStad.Web.UI.UIServiceReference;

namespace StockholmsStad.Web.UI.Class.Model
{
    /// <summary>
    /// MVC Model för bokning
    /// </summary>
    public class BookingModel : ModelBase, IBookingModel
    {
        private readonly IServiceFacade _facade;

        /// <summary>
        /// Skapar model med tillhörande session och servicefasad
        /// </summary>
        /// <param name="session"></param>
        /// <param name="facade"></param>
        public BookingModel(ISession session, IServiceFacade facade)
            : base(session, facade)
        {
            _facade = facade;
        }

        #region IBookingModel Members

        /// <summary>
        /// Alla lediga tider som går att boka för en vigsel
        /// </summary>
        public IList<TimeBlock> GetFreeTimeblocks(User user, bool ordinary)
        {
            return _facade.GetFreeTimeblocks(user, ordinary);
        }


        /// <summary>
        /// Alla bokade dagar som går att sätta som önskat datum
        /// </summary>
        public IList<TimeBlock> GetBookedTimeblocks(User user)
        {
            return _facade.GetBookedTimeblocks(user);
        }


        /// <summary>
        /// Sparar av nuvarande bokning till server
        /// </summary>
        public void RegisterBooking(User user)
        {
            Booking booking = Booking;
            booking.BookingMadeBeforeLogin = false;
            _facade.RegisterBooking(user, booking, RegistrationTicketId.Value);
            Booking = booking;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        public void CancelBooking(User user)
        {
            Booking booking = Booking;
            booking.BookingMadeBeforeLogin = false;
            _facade.CancelBooking(user, booking, RegistrationTicketId.Value);
            Booking = null;
        }

        /// <summary>
        /// Hämtar textvärde för ceremonityp
        /// </summary>
        /// <param name="ceremonyTypeId"></param>
        /// <returns></returns>
        public string GetLocationName(int ceremonyTypeId)
        {
            switch (ceremonyTypeId)
            {
                case (int) CeremonyType.Individual:
                    return "Annan plats";
                case (int) CeremonyType.Ordinary:
                    return "Stadshuset";
                default:
                    return "";
            }
        }

        /// <summary>
        /// Returnerar true om bokningskoden matchas av en förrättare
        /// </summary>
        /// <param name="user"></param>
        /// <param name="text"></param>
        /// <returns></returns>
        public bool IsBookingCodeValid(User user, string text)
        {
            return _facade.IsBookingCodeValid(user, text);
        }

        /// <summary>
        /// Alla tillgängliga ceremonityper. Borde vara Stadshuset och Individuell
        /// </summary>
        public IList<ValueIdPair> CeremonyTypes
        {
            get { return _facade.CeremonyTypes; }
        }

        /// <summary>
        /// Returnerar true om bokningen kan uppdateras från webbapplikationen
        /// </summary>
        /// <returns></returns>
        public bool IsUpdateable()
        {
            return _facade.IsUpdateable(Booking);
        }
        #endregion
    }
}